Ik weet niet zeker hoe ik mijn vraag echt onder woorden moet brengen, dus laat me proberen het uit te leggen met een voorbeeld: Laten we zeggen dat mijn programma raar gedrag vertoont bij een specifieke actie. Ik heb al een code gevonden die de oorzaak is van dit rare gedrag. Bij het uitschakelen van deze reeks kom ik dit gedrag niet tegen. Helaas heb ik deze code nodig omdat er dan iets anders niet werkt. Dus wat ik nu ga doen, is uitzoeken waarom iets anders gaat als dat codefragment actief is. Om beter te begrijpen wat er aan de hand is, wil ik soms de hele actie uitvoeren inclusief de 'slechte code' en soms zonder. Dan kan ik de uitkomst vergelijken, bijvoorbeeld wat er gebeurt in de gebruikersinterface of wat mijn functie retourneert. De eerste benadering die bij me opkomt is om mijn programma uit te voeren met de code ingeschakeld, te doen wat ik wil, dan mijn programma te stoppen, commentaar te geven op de code, opnieuw te compileren en opnieuw te starten. Um ... dat klinkt stom. Vooral als ik die code dan weer aan moet zetten om een andere keer het andere gedrag te zien, en dan weer uit, en aan, en uit, enzovoort. Het is voor mij geen optie om breekpunten te gebruiken en de volgorde van de instructies te beïnvloeden of om waarden aan te passen zodat ik if-statements, for-loops etc. tegenkom of niet. Twee voorbeelden: Ik debugger een kritisch timinggedrag en wanneer ik het programma stop, verandert de timing aanzienlijk. Het eerste breekpunt dat ik kan instellen, moet dus aan het einde van de actie zijn. 1 Ik verwacht dat er een tooltip of ander venster verschijnt dat wordt 'onderdrukt' wanneer de focus wordt gegeven aan VS. Ik kan dus helemaal geen breekpunten gebruiken. Noch aan het begin, noch aan het einde van de actie 1 Is er een techniek in Visual Studio 2012 waarmee ik deze code als optioneel kan markeren en ik kan beslissen of ik deze codereeks al dan niet wil uitvoeren voordat ik de actie uitvoer? Ik denk aan zoiets als if (true | false) op een hoger niveau. Ik ben niet op zoek naar een oplossing waarbij ik mijn programma meerdere keren moet herhalen. In dat geval zou ik nog steeds de eenvoudige benadering kunnen doen door simpelweg de code te becommentariëren met #if false. 1 Merk op dat ik natuurlijk een breekpunt kan instellen als ik op een bepaalde positie naar een specifieke variabele moet kijken (als ik de waarde niet in de uitvoer heb geschreven), maar ik zal de breekpunten weer uitschakelen om de hele actie in één uit te voeren Gaan.
2020-12-07 23:08:57
In de Visual Studio debugger kun je een breakpoint instellen vlak voor je "code in kwestie". Wanneer de code op dat punt stopt, kunt u ervoor kiezen om deze door te laten gaan of u kunt met de rechtermuisknop op een andere regel klikken en Volgende instructie instellen selecteren. Het is een beetje een rare optie, maar ik ben het gaan waarderen. | De enige optie die ik kan bedenken, is om iets aan uw gebruikersinterface toe te voegen dat alleen verschijnt bij het debuggen, waardoor u de mogelijkheid krijgt om de betreffende bewerkingen op te nemen / uit te sluiten. Terwijl je toch bezig bent, wil je misschien ook inschakelen om de applicatie te resetten naar een "bekende staat" vanuit de gebruikersinterface. | Ik denk aan zoiets als if (true | false) op een hoger niveau. Waarom "op een hoger niveau"? Waarom zou je dit niet precies gebruiken? U wilt dat een stukje code soms wordt uitgevoerd, soms niet, en de switch moet tijdens runtime worden gewijzigd, niet tijdens het compileren - dit leidt uiteraard tot if (voorwaarde) { // code in inzet } De vangst hier is wat voor soort voorwaarde je gaat gebruiken - misschien een variabele die je instelt op true in de releaseversie van je code, en soms op false in je debug-versie. Misschien wordt de waarde uit een configuratiebestand gehaald, misschien uit een omgevingsvariabele, misschien berekend door een soort logica in je programma, wat en wanneer je maar wilt. EDIT: je zou ook een booleaanse variabele in je code kunnen introduceren voor condition, deze standaard initialiseren op true en de waarde ervan wijzigen met de debugger wanneer je maar wilt. | Preprocessor-richtlijnen zijn misschien wat u zoekt. Het zijn stukjes code die de compiler moet uitvoeren, herkenbaar door te beginnen met een # -teken (en stilistisch gezien volgen ze standaard niet het inspringpatroon van je code, maar bevinden ze zich altijd stevig aan de linkerkant van de editor. ): # definiëren INCLUDE_DODGY_CODE openbare leegte MyMethodWithDodgyBits () { #als INCLUDE_DODGY_CODE myDodgyMethod (); #stop als myOkMethod (); } In dit geval, als #define INCLUDE_DODGY_CODE was opgenomen, wordt de aanroep myDodgyMethod () in uw programma gecompileerd. Anders wordt de aanroep overgeslagen door de compiler en bestaat deze gewoon niet in uw binaire bestand. | Er zijn een aantal opties voor foutopsporing zoals u vraagt. Visual Studio heeft een aantal opties om direct door code te navigeren. U kunt de functie Set Next Statement gebruiken om direct naar een bepaald statement te gaan. U kunt waarden ook rechtstreeks bewerken via het directe venster, de QuickWatch en de knopinfo die tijdens het debuggen over variabelen zweeft. Visual Studio heeft ook de mogelijkheid om de uitvoeringsgeschiedenis af te spelen. Bekijk IntelliTrace om aan de slag te gaan. Het kan handig zijn als u meerdere aandachtspunten heeft die op elkaar inwerken en de foutconditie genereren. U kunt uw codegedeelten ook in voorwaardelijke blokken wikkelen en de voorwaardelijke variabelen naar wens instellen. Dat kan zijn terwijl u debugt, of u kunt parameters doorgeven via een configuratiebestand. Het gebruik van voorwaardelijke controles kan eenvoudiger zijn dan handmatig door code bladeren als er een aantal uitspraken zijn die u wilt uitsluiten. | Het hangt soms af van de versie van VS en de taal, maar je kunt de code met plezier bewerken (om er commentaar op te geven, of het in een grote #ifdef 0 omsluiten) en vervolgens op alt + F10 drukken en de compiler zal opnieuw compileren, opnieuw koppelen en doorgaan met uitvoeren alsof je er nooit aan had gerommeld. Maar hoewel dat prachtig werkt in VC ++ (sinds VS v6 IIRC), kan C # problemen hebben - ik vind (met VS2010) dat ik op deze manier niet kan bewerken en doorgaan met functies die lambda (voornamelijk linq) -instructies en 64-bits code bevatten deed dit ook nooit. Toch is het de moeite waard om mee te experimenteren, omdat het soms erg nuttig is. | Ik heb gewerkt aan applicaties met optionele code die alleen wordt gebruikt voor foutopsporing en die niet in de productieomgeving zou moeten verschijnen. Dit segment van optionele code was voor ons het gemakkelijkst te besturen met een configuratiebestand, omdat het niet opnieuw moest worden gecompileerd om te wijzigen. Zo'n oplossing is misschien niet het einde van het eindresultaat, maar het kan helpen om er doorheen te komen totdat er een oplossing is gevonden. Als je meerdere optionele secties hebt die in combinatie moeten worden getest, kan deze stijl van reparatie meerdere sleutels in het configuratiebestand vereisen, wat een nadeel kan zijn en lastig om bij te houden. | Uw vraag is niet helemaal duidelijk, wat mogelijk de reden is waarom er zoveel antwoorden zijn waarvan u denkt dat ze ongeldig zijn. U kunt overwegen de vraag anders te formuleren als niemand de vraag lijkt te kunnen beantwoorden. Met het risico nog een ongeldig antwoord te geven, zal ik wat input toevoegen over hoe ik het probleem in het verleden heb aangepakt. De eenvoudigste manier is om een optionele code erin te plaatsen #if DEBUG // Optionele code hier #stop als Op die manier is de code geïmplementeerd wanneer u in de foutopsporingsmodus draait en wanneer u in de releasemodus draait, is dat niet het geval. Om tussen de twee te schakelen, moet u op één knop klikken. Ik heb hetzelfde probleem ook op een vergelijkbare manier opgelost met een eenvoudige vlag: bool runOptionalCode = false; dan if (runOptionalCode) { // Plaats hier optionele code } Nog een keer,schakelen tussen modi vereist het veranderen van één woord, dus het is een eenvoudige taak. U vermeldt dit in uw vraag, maar veronachtzaamt het om onduidelijke redenen. Zoals ik al zei, het kost heel weinig moeite om tussen de twee te schakelen. Als u wijzigingen moet aanbrengen tussen de code terwijl deze wordt uitgevoerd, is de beste manier om een UI-item of een toetsaanslag te gebruiken die de vlag wijzigt die in het bovenstaande voorbeeld wordt genoemd. Afhankelijk van uw toepassing kan dit echter meer moeite kosten dan het waard is. In het verleden heb ik gemerkt dat wanneer ik al een key listener heb geïmplementeerd als onderdeel van het project, het hebben van een paar toetsaanslagen om te beslissen of ik mijn debug-code (optioneel) wil uitvoeren het beste werkt. In een applicatie zonder key listeners blijf ik liever bij een van de voorgaande methoden. | Uw antwoord StackExchange.ifUsing ("editor", function () { StackExchange.using ("externalEditor", function () { StackExchange.using ("snippets", function () { StackExchange.snippets.init (); }); }); }, "code-snippets"); StackExchange.ready (function () { var channelOptions = { tags: "" .split (""), id: "1" }; initTagRenderer ("". split (""), "" .split (""), channelOptions); StackExchange.using ("externalEditor", function () { // Moet de editor na fragmenten activeren, als fragmenten zijn ingeschakeld if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ("snippets", function () { createEditor (); }); } anders { createEditor (); } }); functie createEditor () { StackExchange.prepareEditor ({ useStacksEditor: false, heartbeatType: 'antwoord', autoActivateHeartbeat: false, convertImagesToLinks: waar, noModals: waar, showLowRepImageUploadWarning: true, ReputationToPostImages: 10, bindNavPrevention: true, postfix: "", imageUploader: { brandingHtml: "Aangedreven door \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "hoogte = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.7256 4.91628 46.0943 46.7256 4.91628 46.0845 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.492 14.045.14.07 37.492 14.045.14.07 37.045 14.6954 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.520455 37.0451 11.5954.545.85.8 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.63.7031 28.455 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28 ... 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335Z79C24.13 26.6335Z79C24.13 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11.862.862.806 13.862.862.862 13.862 13.862.862.862 13.862.862.16.862 13.862.86.86.18.13.13.13.13.13.13.13.13.13.13.13.13.13.13.13.13.13.16.86.16.86 13.862 13.862.16.80 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 4.62866 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.94118 ... C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ U003cpath d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8962C2.85798 13.896213.2535 3.31675 11.9512V6.59049Z \ "/ \ u003e \ u003cpath d = \" M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.73.72 1.87869 3.73.72 2.87869 0.400291Z \ "fill = \" # 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e", contentPolicyHtml: "Gebruikersbijdragen in licentie gegeven onder \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (contentbeleid) \ u003c / a \ u003e", allowUrls: waar }, onDemand: waar, discardSelector: ".discard-answer" , onmiddellijkShowMarkdownHelp: true, enableSnippets: true }); } }); Bedankt voor het bijdragen aan een antwoord op Stack Overflow! Zorg ervoor dat u de vraag beantwoordt. Geef details en deel uw onderzoek! Maar vermijd ... Om hulp, opheldering vragen of op andere antwoorden reageren. Uitspraken doen op basis van meningen; ondersteun ze met referenties of persoonlijke ervaring. Bekijk onze tips voor het schrijven van goede antwoorden voor meer informatie. Concept opgeslagen Concept verwijderd Meld u aan of log in StackExchange.ready (function () { StackExchange.helpers.onClickDraftSave ('# login-link'); }); Meld u aan met Google Meld u aan met Facebook Meld u aan met e-mail en wachtwoord Verzenden Post als gast Naam E-mail Vereist, maar nooit getoond StackExchange.ready ( functie () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f19425104% 2fcan-i-mark-some-code-as-optional-while-debugging-in visual-studio-2012% 23new-answer ',' question_page '); } ); Post als gast Naam E-mail Vereist, maar nooit getoond Plaats uw antwoord Gooi weg Door op “Plaats uw antwoord” te klikken, gaat u akkoord met onze servicevoorwaarden, privacybeleid en cookiebeleid Niet het antwoord waar je naar zoekt? Blader door andere vragen met de tag debugging visual-studio of stel uw eigen vraag.